package com.mini.grpc.client;

import com.mini.grpc.common.MethodDescriptor;

/**
 * MiniGrpcChannel是客户端与服务端通信的核心组件，负责管理连接和调用。
 */
public interface MiniGrpcChannel {
    
    /**
     * 创建一个新的RPC调用
     *
     * @param method 方法描述符
     * @param options 调用选项
     * @param <ReqT> 请求类型
     * @param <RespT> 响应类型
     * @return 客户端调用对象
     */
    <ReqT, RespT> ClientCall<ReqT, RespT> newCall(MethodDescriptor<ReqT, RespT> method, CallOptions options);
    
    /**
     * 获取通道的连接状态
     *
     * @param requestConnection 如果为true，则在通道处于IDLE状态时尝试建立连接
     * @return 连接状态
     */
    ConnectivityState getState(boolean requestConnection);
    
    /**
     * 关闭通道
     * 
     * @return this
     */
    MiniGrpcChannel shutdown();
    
    /**
     * 判断通道是否已关闭
     *
     * @return 如果通道已关闭则返回true，否则返回false
     */
    boolean isShutdown();
    
    /**
     * 判断通道是否已终止
     *
     * @return 如果通道已终止则返回true，否则返回false
     */
    boolean isTerminated();
    
    /**
     * 连接状态枚举
     */
    enum ConnectivityState {
        /**
         * 空闲状态，没有活动的连接
         */
        IDLE,
        
        /**
         * 正在连接
         */
        CONNECTING,
        
        /**
         * 已连接
         */
        READY,
        
        /**
         * 暂时失败，将尝试重新连接
         */
        TRANSIENT_FAILURE,
        
        /**
         * 已关闭
         */
        SHUTDOWN
    }
} 